package com.yinhd.study.customLog;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @program: study
 * @description:
 * @Author: yinhd
 * @create: 2022-02-09 10:18
 **/
@Target(value = ElementType.METHOD)
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
public @interface OperationLog {
    //操作者
    String operator() default "";

    //动作
    String action() default "";

    //承受者
    String heir() default "";

    //操作内容
    String content() default "";

    //操作状态
    String state() default "";

    /*
    @OperationLog 动态参数的操作日志拼接注解
    使用方法 :
    1.基本操作
    在接口上添加@Log日志
    @OperationLog(operator = "张三",action = "修改",heir = "字典项",content = "的资产编码",state = "成功")
    ==》 张三修改字典项的资产编码成功（operator+action+heir+content+state 即：操作者+动作+承受者+操作内容+操作状态 的组合）

    以上五种属性均为非必填项
    operator 默认为当前登录用户
    action   默认当前请求类型  （GET--查询  POST--添加  PUT--修改  DETELE--删除）
    heir     默认为空
    content  默认为空
    state    默认为Resultcode的状态 （0--成功  1--失败）

    2.动态参数语法规则
    基于SPEL实现,五种属性均可填入SPEL表达式，样例中不涉及的情景可参考SPEL表达式使用方法
       1)单一属性/对象   {{#name}}  {{#Object.name}}
       2)集合   {{#map[name]}}  {{#list[1]}}
       3)三目运算    {{#name.equals('OperationLog') ? object1 : object2}}
       4)......

     3.@OperationLog可拼接返回结果中的值
     @OperationLog(operator = "张三",action = "修改",heir = "字典项",content = "的资产编码",state = "{{#resultCode == 0?'成功':'失败'}}")
     ==》张三修改字典项的自残编码成功    根据返回结果resultCode解析 【直接拼接返回体参数即可】
     */
}
